package cn.seaboot.word.html;

import cn.seaboot.commons.core.CommonUtils;
import cn.seaboot.html.HtmlReader;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

import java.io.IOException;
import java.io.Writer;
import java.util.List;

/**
 * 表格内容提取
 * <p>
 * 这是我们公司用的一种专用格式，table 用于展示代码样例。
 *
 * @author Mr.css
 * @version 2025-06-26 14:37
 */
public class TableCodeReader implements HtmlReader<XWPFTable> {

    /**
     * 结果写出
     */
    private final Writer writer;

    public TableCodeReader(Writer writer) {
        this.writer = writer;
    }

    /**
     * 读取表格内容
     *
     * @param table 表格对象
     * @throws IOException -
     */
    @Override
    public void read(XWPFTable table) throws IOException {
        // 处理表格
        List<XWPFTableRow> rows = table.getRows();
        if (rows != null && !rows.isEmpty()) {
            writer.write("<table><tbody>");
            for (XWPFTableRow row : rows) {
                writer.write("<tr>");
                List<XWPFTableCell> cells = row.getTableCells();
                for (XWPFTableCell cell : cells) {
                    readTableCell(cell);
                }
                writer.write("</tr>");
            }
            writer.write("</tbody></table>");
        }
    }

    /**
     * 读取单元格
     * <p>
     * 通过 <pre> 标签将内容原样输出，并且忽略了可能存在的图片。
     *
     * @param cell 单元格对象
     * @throws IOException -
     */
    public void readTableCell(XWPFTableCell cell) throws IOException {
        String text = cell.getText();
        if (CommonUtils.isEmpty(text)) {
            writer.write("<td></td>");
        } else {
            String ret = StringUtils
                    .replaceEach(cell.getText(), new String[]{">", "<", "&", "\""}, new String[]{"&gt;", "&lt;", "&amp;", "&quot;"});
            writer.write("<td><pre><code>" + ret + "</code></pre></td>");
        }
    }
}
